home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / wink2 / src / rsblib.asm < prev    next >
Encoding:
Assembly Source File  |  1992-04-17  |  6.8 KB  |  401 lines

  1. ;**************************
  2. ;*                        *
  3. ;* High-C用 RS-232C ライブラリー  *
  4. ;*         Programmed by 山崎憲明    *
  5. ;*              NIFTY ID=QGB01416    *
  6. ;*            nanno-NET ID= YAMA      *
  7. ;*                        *
  8. ;**************************
  9. ;
  10. ;
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12. ;
  13. ;    v0.01    Makeing by YAMA
  14. ;
  15. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  16. ;
  17. ;セグメント宣言
  18. ;
  19. rmdata    segment dword public 'DATA' use16
  20. rmdata    ends
  21. RSBcode    segment dword public 'CODE' use32
  22. RSBcode    ends
  23.  
  24.  
  25. rsb_para_s    struc        ;9 artcles 17 bytes
  26.     mode    db    ?
  27.     baud    db    ?
  28.     rbuf    dd    ?
  29.     stime    dw    ?
  30.     rtime    dw    ?
  31.     rinf    dd    ?
  32.     extn    db    ?
  33.     xon    db    ?
  34.     xoff    db    ?
  35. rsb_para_s    ends
  36.  
  37. ;
  38. ;定数
  39. ;
  40.  
  41. TRUE    equ    1
  42. FALSE    equ    0
  43.  
  44.     assume    cs:RSBcode,ds:rmdata
  45.  
  46. ;
  47. ;リアルモードデータセグメント
  48. ;
  49.  
  50. rmdata segment 
  51. ;
  52. ;
  53. ;
  54.  
  55. real_seg    dw    0    ;データエリアのリアルモードセグメント値
  56.  
  57. rm_int_no    dw    0    ;int no.
  58. rm_ds        dw    0    ;リアルモードds
  59. rm_es        dw    0    ;リアルモードes
  60. rm_fs        dw    0    ;リアルモードfs
  61. rm_gs        dw    0    ;リアルモードgs
  62. rm_eax        dd    0    ;リアルモードeax
  63. rm_edx        dd    0    ;リアルモードedx
  64.  
  65. ;
  66. ;  データ領域
  67. ;
  68. rsb_para    rsb_para_s    <>        ;パラメータエリア
  69.  
  70. buf_size    equ    1024*5            ;受信バッファサイズ(5Kbyte)
  71. rsb_buf        label    byte
  72.         dw    buf_size
  73.         dw    0            ;文字カウント
  74.         dw    0            ;入力ポインタ
  75.         dw    0            ;出力ポインタ
  76.         db    buf_size+16 dup(0)    ;受信バッファ
  77.  
  78.  
  79.         public    rsb_end_real    ;リアルモードエンドアドレス
  80. rsb_end_real    label    byte
  81.  
  82. rmdata    ends
  83.  
  84. ;
  85. ;
  86. ;
  87. ;
  88. ;プロテクトモードーコード
  89. ;
  90.  
  91. RSBcode    segment
  92.  
  93. ;
  94. ;プロテクトルーチン    
  95. ;
  96.  
  97. ;データセグメントのリアルモードセグメント値の算定
  98.  
  99. set_real_seg    proc    near
  100.  
  101.         mov    ax,ds        ;リアルモード用セグメント算定
  102.         mov    es,ax        ;先頭アドレス
  103.         xor    ebx,ebx        ;
  104.         lea    ecx,rsb_end_real;リアルモードコードセグメントサイズ
  105.         mov    ax,250Fh    ;プロテクト=>リアルアドレス変換
  106.         int    21h
  107.         ;jc    err        ;エラー処理
  108.         ;test    ecx,0FFFFh    ;
  109.         ;jnz    err        ;
  110.         shr    ecx,16
  111.         mov    real_seg,cx    ;リアルモードセグメント値設定
  112.  
  113.         ret
  114. set_real_seg    endp
  115.  
  116.  
  117. ;リアルモード割り込み発行(ポインター指定付)
  118.  
  119. int_9Bh_2    proc    near
  120.  
  121.         mov    rm_eax,eax
  122.         mov    rm_edx,edx
  123.  
  124.         mov    cx,real_seg
  125.         mov    rm_ds,cx    ;ds設定
  126.         mov    rm_es,cx    ;es設定
  127.         mov    rm_fs,cx    ;fs設定
  128.         mov    rm_gs,cx    ;gs設定
  129.  
  130.         mov    byte ptr rm_int_no,9Bh    ;int no.
  131.         mov    edx,offset rm_int_no
  132.         mov    ax,2511h
  133.         int    21h
  134.         mov    edx,rm_edx
  135.         ret
  136. int_9Bh_2    endp
  137.  
  138.  
  139. ;回線オープン
  140. ;int     RSB_open(int port);
  141. ;
  142.     public    RSB_open
  143. RSB_open    proc    near
  144.  
  145.         push    ebp        ;High-C用ヘッダー
  146.         mov    ebp,esp
  147.  
  148.         mov    eax,[ebp][8]    ;引数 1( int port )
  149.         mov    ah,01h        ;open
  150.         int    9Bh
  151.         movzx    eax,ah
  152.  
  153.         pop    ebp        ;High-C用後処理
  154.         ret
  155. RSB_open    endp
  156.  
  157. ;回線クローズ
  158. ;int     RSB_close(int port);
  159. ;
  160.     public    RSB_close
  161. RSB_close    proc    near
  162.  
  163.         push    ebp        ;High-C用ヘッダー
  164.         mov    ebp,esp
  165.  
  166.         mov    eax,[ebp][8]    ;引数 1( int port )
  167.         mov    ah,02h        ;close
  168.         int    9Bh
  169.         movzx    eax,ah
  170.  
  171.         pop    ebp        ;High-C用後処理
  172.         ret
  173. RSB_close    endp
  174.  
  175. ;通信パラメータ設定
  176. ;int    RSB_setpara(int port,char *para);
  177. ;
  178.     public    RSB_setpara
  179. RSB_setpara    proc    near
  180.  
  181.         push    ebp        ;High-C用ヘッダー
  182.         mov    ebp,esp
  183.         push    es
  184.         push    esi
  185.         push    edi
  186.         push    ebx
  187.         push    ecx
  188.  
  189.         call    set_real_seg
  190.  
  191.         mov    esi,[ebp][12]    ;引数 2( char *para )
  192.         mov    edi,offset rsb_para
  193.         mov    ecx,11h
  194.         rep    movsb
  195.  
  196.         mov    esi,[ebp][12]    ;引数 2( char *para )
  197.         mov    edi,offset rsb_para
  198.         mov    ax,real_seg        ;受信バッファアドレスが
  199.         mov    word ptr[edi].rbuf+2,ax    ;独自バッファを指すように
  200.         mov    eax,offset rsb_buf    ;リアル、ネイティブ両ポインタ
  201.         mov    [esi].rbuf,eax        ;を修正
  202.         mov    word ptr[edi].rbuf,ax    ;
  203.  
  204.         mov    ax,buf_size
  205.         mov    word ptr[rsb_buf],ax    ; buff Size Init Apend by Ken
  206.  
  207.         mov    [esi].rinf,0        ;受信通知せず
  208.         mov    [edi].rinf,0        ;
  209.  
  210.         mov    eax,[ebp][8]    ;引数 1( int port )
  211.         mov    ah,03h        ;setpara
  212.         mov    edi,offset rsb_para
  213.         call    int_9Bh_2
  214.         movzx    eax,ah
  215.  
  216.         pop    ecx
  217.         pop    ebx        ;High-C用後処理
  218.         pop    edi
  219.         pop    esi
  220.         pop    es
  221.         pop    ebp
  222.         ret
  223. RSB_setpara    endp
  224.  
  225. ;通信パラメータ読み取り
  226. ;int    RSB_rdpara(int port,char *para);
  227. ;
  228.     public    RSB_rdpara
  229. RSB_rdpara    proc    near
  230.  
  231.         push    ebp        ;High-C用ヘッダー
  232.         mov    ebp,esp
  233.         push    es
  234.         push    esi
  235.         push    edi
  236.         push    ebx
  237.         push    ecx
  238.  
  239.         call    set_real_seg
  240.  
  241.         mov    eax,[ebp][8]    ;引数 1( int port )
  242.         mov    ah,04h        ;rdpara
  243.         mov    edi,offset rsb_para
  244.         call    int_9Bh_2
  245.  
  246.         mov    esi,offset rsb_para
  247.         mov    edi,[ebp][12]    ;引数 2( char *para )
  248.         mov    ecx,11h
  249.         rep    movsb
  250.  
  251.         movzx    eax,ah
  252.  
  253.         pop    ecx
  254.         pop    ebx        ;High-C用後処理
  255.         pop    edi
  256.         pop    esi
  257.         pop    es
  258.         pop    ebp
  259.         ret
  260. RSB_rdpara    endp
  261.  
  262.  
  263. ;受信データ数の読み取り
  264. ;int    RSB_read(int port, int *len);
  265. ;
  266.     public    RSB_read
  267. RSB_read    proc    near
  268.  
  269.         push    ebp        ;High-C用ヘッダー
  270.         mov    ebp,esp
  271.         push    edi
  272.  
  273.         mov    eax,[ebp][8]    ;引数 1( int port )
  274.         mov    ah,05h        ;read
  275.         int    9Bh
  276.         movzx    edx,dx
  277.         mov    edi,[ebp][12]    ;引数 2( int *len )
  278.         mov    [edi],edx
  279.         movzx    eax,ah
  280.  
  281.         pop    edi        ;High-C用後処理
  282.         pop    ebp
  283.         ret
  284. RSB_read    endp
  285.  
  286.  
  287. ;データの受信
  288. ;int    RSB_receive(int port,int *ch,int *st);
  289. ;注:<return>=エラーno.(ah)  ch=data(dl)  st=ステータス(h:dh,l:cl)
  290. ;
  291.     public    RSB_receive
  292. RSB_receive    proc    near
  293.  
  294.         push    ebp        ;High-C用ヘッダー
  295.         mov    ebp,esp
  296.         push    es
  297.         push    esi
  298.         push    edi
  299.         push    ebx
  300.         push    ecx
  301.  
  302.         mov    eax,[ebp][8]    ;引数 1( int port )
  303.         mov    ah,06h        ;receive
  304.         int    9Bh
  305.         mov    ch,dh
  306.         movzx    ecx,cx
  307.         movzx    edx,dl
  308.         mov    edi,[ebp][12]    ;引数 2( int *ch )
  309.         mov    [edi],edx
  310.         mov    edi,[ebp][16]    ;引数 3( int *st )
  311.         mov    [edi],ecx
  312.         movzx    eax,ah
  313.  
  314.         pop    ecx
  315.         pop    ebx        ;High-C用後処理
  316.         pop    edi
  317.         pop    esi
  318.         pop    es
  319.         pop    ebp
  320.         ret
  321. RSB_receive    endp
  322.  
  323.  
  324. ;データの送信
  325. ;int    RSB_send(int port,int ch,int *st);
  326. ;注:<return>=エラーno.(ah)  st=ステータス(l:dh)
  327. ;
  328.  
  329.     public    RSB_send
  330. RSB_send    proc    near
  331.  
  332.         push    ebp        ;High-C用ヘッダー
  333.         mov    ebp,esp
  334.         push    es
  335.         push    esi
  336.         push    edi
  337.         push    ebx
  338.         push    ecx
  339.  
  340.         mov    eax,[ebp][8]    ;引数 1( int port )
  341.         mov    edx,[ebp][12]    ;引数 2( int ch )
  342.         mov    ah,07h        ;send
  343.         int    9Bh
  344.         movzx    edx,dh
  345.         mov    edi,[ebp][16]    ;引数 3( int *st )
  346.         mov    [edi],edx
  347.         movzx    eax,ah
  348.  
  349.         pop    ecx
  350.         pop    ebx        ;High-C用後処理
  351.         pop    edi
  352.         pop    esi
  353.         pop    es
  354.         pop    ebp
  355.         ret
  356. RSB_send    endp
  357.  
  358. ;拡張DTR信号の保持設定
  359. ;int    RSB_dtr(int port,int sw);
  360. ;
  361.  
  362.     public    RSB_dtr
  363. RSB_dtr        proc    near
  364.  
  365.         push    ebp        ;High-C用ヘッダー
  366.         mov    ebp,esp
  367.  
  368.         mov    eax,[ebp][8]    ;引数 1( int port )
  369.         mov    edx,[ebp][12]    ;引数 2( int sw )
  370.         mov    ah,0Eh        ;dtr
  371.         int    9Bh
  372.         movzx    eax,ah
  373.  
  374.         pop    ebp        ;High-C用後処理
  375.         ret
  376. RSB_dtr        endp
  377.  
  378. ;Break信号の送信
  379. ;int    RSB_break(int port,int sec);
  380. ;
  381.  
  382.     public    RSB_break
  383. RSB_break    proc    near
  384.  
  385.         push    ebp        ;High-C用ヘッダー
  386.         mov    ebp,esp
  387.  
  388.         mov    eax,[ebp][8]    ;引数 1( int port )
  389.         mov    edx,[ebp][12]    ;引数 2( int sec )
  390.         mov    ah,0Bh        ;break
  391.         int    9Bh
  392.         movzx    eax,ah
  393.  
  394.         pop    ebp        ;High-C用後処理
  395.         ret
  396. RSB_break    endp
  397.  
  398. RSBcode    ends
  399.  
  400.     end
  401.